package com.woniuxy.properties;

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.woniuxy.utils.RabbitConnection;
import lombok.extern.log4j.Log4j2;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * @Author: linKe
 * @Date: 2022/1/10 15:49
 * @FileName: Producer
 * @version: 1.0
 * @Description: 设置消息属性
 * 两个消费者同时绑定在一个消息队列上
 * 生产者类 发送消息
 */
@Log4j2
public class ProducerProperties {

    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = RabbitConnection.getConnection();
        // 连接通道
        Channel channel = connection.createChannel();

        channel.queueDeclare("queueWork", true, false, false, null);

        // 增加消息头信息
        Map<String, Object> headers = new HashMap<>(10);
        headers.put("header", "测试");
        // 设置消息属性
        AMQP.BasicProperties properties = new AMQP.BasicProperties().builder()
                // 消息持久化：默认值1，重启服务，服务丢失；2 持久化
                .deliveryMode(2)
                // 设置编码格式
                .contentEncoding("utf-8")
                /*
                 设置过期时间: 指定的时间内没有消费信息；
                        如果没有死信队列： 自动删除，消息丢失
                        如果有死信队列：进入死信队列
                 */
                .expiration("10000")
                // 添加请求头信息
                .headers(headers)
                .build();

        /*
        发送消息  Simplest模式使用的是默认交换机
        参数：
            (String exchange, String routingKey, BasicProperties props, byte[] body)
            exchange - 交换机（使用默认交换机） 将消息发布到的交换   生成的消息先进入交换机，交换机根据路由规则，将消息投递到指定的队列
            routingKey – 路由键（消息队列名） Simplest模式就是消息队列名
            props - 消息的其他属性 - 路由标头等
            body - 正文 消息正文
         */
        for (int i = 0; i < 9; i++) {
            channel.basicPublish("exchangeTopic", "email", properties, ("邮箱服务..." + i).getBytes(StandardCharsets.UTF_8));
            /// channel.basicPublish("", "queueEmailWork", null, ("短信服务..."+i).getBytes(StandardCharsets.UTF_8));
            log.info("发送成功");
        }
        // 关闭资源
        RabbitConnection.close(connection, channel);
    }

}
